Client-Side Load Balancing হলো একটি কৌশল যেখানে ক্লায়েন্ট নিজেই বিভিন্ন সার্ভারের মধ্যে ইনকামিং অনুরোধগুলো (requests) বন্টন করে। এটি সাধারণত Spring Cloud ব্যবহার করে পরিচালিত হয়, যেখানে Ribbon এবং Spring Cloud LoadBalancer-এর মতো টুলস ব্যবহৃত হয়।
কীভাবে কাজ করে
- Server Discovery:
- ক্লায়েন্ট একটি সার্ভিস রেজিস্ট্রি (যেমন, Eureka) থেকে উপলব্ধ সার্ভারের তালিকা সংগ্রহ করে।
- Load Balancing Algorithm:
- ক্লায়েন্ট উপলব্ধ সার্ভারগুলোর মধ্যে একটি নির্দিষ্ট অ্যালগরিদম (যেমন, Round Robin) অনুসারে অনুরোধ পাঠায়।
- Failover Support:
- একটি সার্ভার অপ্রাপ্য হলে ক্লায়েন্ট স্বয়ংক্রিয়ভাবে অন্য সার্ভারে অনুরোধ পাঠায়।
Client-Side Load Balancing টুলস
১. Spring Cloud LoadBalancer (Spring Cloud Netflix এর পরবর্তী প্রজন্ম)
- নতুন প্রজন্মের লাইটওয়েট এবং সহজে ব্যবহারযোগ্য।
২. Netflix Ribbon (Deprecated)
- একটি পুরোনো এবং শক্তিশালী টুল যা Spring Boot 2.4.0 থেকে Deprecated করা হয়েছে।
Spring Cloud LoadBalancer ব্যবহার করার উদাহরণ
Step 1: প্রয়োজনীয় ডিপেন্ডেন্সি যোগ করা
Maven:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
Gradle:
implementation 'org.springframework.cloud:spring-cloud-starter-loadbalancer'
Step 2: Service Discovery (Eureka Server সেটআপ)
Eureka Server সার্ভিস রেজিস্ট্রির জন্য Spring Boot অ্যাপ্লিকেশন চালু করুন:
pom.xml-এ নিচের ডিপেন্ডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
application.properties কনফিগার করুন:
spring.application.name=eureka-server
server.port=8761
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
Eureka Server চালু করার জন্য @EnableEurekaServer ব্যবহার করুন:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}
Step 3: Client-Side Configuration
Spring Boot ক্লায়েন্ট সার্ভিসের জন্য:
pom.xml-এ নিচের ডিপেন্ডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
application.propertiesকনফিগার করুন:
spring.application.name=user-service
server.port=8080
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
Step 4: WebClient এর মাধ্যমে Load Balancing
WebClient এবং Spring Cloud LoadBalancer ব্যবহার করে সার্ভার লোড ব্যালেন্সিং কার্যকর করুন।
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;
@Configuration
public class WebClientConfig {
@Bean
@LoadBalanced // LoadBalancer এর জন্য Annotation
public WebClient.Builder webClientBuilder() {
return WebClient.builder();
}
}
Step 5: Load Balanced HTTP Request
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
@Service
public class UserClient {
private final WebClient webClient;
public UserClient(WebClient.Builder webClientBuilder) {
this.webClient = webClientBuilder.baseUrl("http://user-service").build();
}
public Mono<String> getUserById(int userId) {
return webClient.get()
.uri("/users/{id}", userId)
.retrieve()
.bodyToMono(String.class);
}
}
Step 6: অ্যাপ্লিকেশন চালানো
Eureka Serverচালু করুন।user-serviceনামে একটি সার্ভিস চালু করুন (যা ব্যবহারকারীর ডেটা সরবরাহ করবে)।- লোড-ব্যালেন্স করা ক্লায়েন্ট চালু করুন এবং HTTP অনুরোধ পাঠান।
Spring Cloud LoadBalancer এর কাজের ধাপ
- Service Registry Integration:
Eureka Serverথেকে উপলব্ধ সার্ভিস তালিকা সংগ্রহ করে।
- Request Distribution:
- ক্লায়েন্ট উপলব্ধ সার্ভিসগুলোর মধ্যে রাউন্ড-রবিন বা অন্য কোনো পদ্ধতিতে অনুরোধ পাঠায়।
- Failover Handling:
- একটি সার্ভিস অপ্রাপ্য হলে অন্য সার্ভিসে অনুরোধ রিডিরেক্ট করে।
উদাহরণ: Round Robin Load Balancing
Scenario:
user-service নামে দুটি সার্ভিস আলাদা পোর্টে চলছে:
localhost:8081localhost:8082
WebClient Call Result:
- প্রথম অনুরোধ যাবে
localhost:8081-এ। - দ্বিতীয় অনুরোধ যাবে
localhost:8082-এ।
Load Balancing Algorithm কাস্টমাইজ করা
application.properties ফাইলে কনফিগার করুন:
spring.cloud.loadbalancer.ribbon.eureka.enabled=true
spring.cloud.loadbalancer.ribbon.enabled=true
কাস্টম স্ট্র্যাটেজি যোগ করা
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.ReactiveLoadBalancer;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
@Component
@LoadBalancerClient(name = "custom-loadbalancer", configuration = CustomLoadBalancerConfig.class)
public class CustomLoadBalancer implements ReactiveLoadBalancer<ServiceInstance> {
@Override
public Mono<Response<ServiceInstance>> choose(Request request) {
// Custom Load Balancing Logic
return Mono.just(new DefaultResponse(null)); // Replace null with your logic
}
}
উপসংহার
Spring Boot-এ Client-Side Load Balancing WebClient এর মাধ্যমে কার্যকরভাবে করা সম্ভব। এটি মাইক্রোসার্ভিস আর্কিটেকচারে সার্ভিস ডিসকভারি এবং উচ্চতর পারফরমেন্স নিশ্চিত করে। Spring Cloud LoadBalancer একটি লাইটওয়েট এবং সহজ সমাধান যা Ribbon এর তুলনায় আরও আধুনিক এবং কার্যকর।
Load Balancing কি?
Load Balancing হলো একটি পদ্ধতি, যা একাধিক সার্ভারের মধ্যে কাজের চাপ (লোড) ভাগাভাগি করে দেয়। এর উদ্দেশ্য হলো সার্ভারগুলোর সক্ষমতা নিশ্চিত করা এবং সিস্টেমের পারফরম্যান্স, স্থায়িত্ব এবং স্কেলেবিলিটি বৃদ্ধি করা। এটি বিশেষ করে মাইক্রোসার্ভিস আর্কিটেকচার-এ ব্যবহৃত হয় যেখানে বিভিন্ন সার্ভার বা ইন্সট্যান্সের মধ্যে কাজ সমানভাবে বিতরণ করা প্রয়োজন।
Load Balancing কেন প্রয়োজন?
- ক্লায়েন্ট রিকোয়েস্টের ভারসাম্য রক্ষা: একাধিক সার্ভারের মধ্যে ভারসাম্য রক্ষা করে সার্ভার ওভারলোড হওয়া থেকে বাঁচায়।
- উচ্চ পারফরম্যান্স: প্রতিটি সার্ভার রিকোয়েস্ট প্রক্রিয়াকরণের জন্য পর্যাপ্ত সময় পায় এবং দ্রুত রেসপন্স প্রদান করে।
- উপলভ্যতা এবং রেডান্ডেন্সি: কোনো সার্ভার ডাউন থাকলে অন্য সার্ভারগুলো রিকোয়েস্ট গ্রহণ করে, যার ফলে সার্ভিস ডাউনটাইম কম হয়।
- স্কেলেবিলিটি: কাজের চাপ বৃদ্ধি পেলে নতুন সার্ভার যোগ করে লোড ব্যালান্সিং সহজে পরিচালনা করা যায়।
- মাইক্রোসার্ভিস কমিউনিকেশন: মাইক্রোসার্ভিস আর্কিটেকচারে একাধিক সার্ভিসের মধ্যে রিকোয়েস্ট সমানভাবে বিতরণ করতে সহায়ক।
Load Balancing-এর পদ্ধতি
- DNS-Based Load Balancing: ডোমেইন নেম সার্ভিস (DNS) ব্যবহার করে লোড ব্যালান্সিং করা হয়।
- Software Load Balancing: সফটওয়্যার টুল (যেমন NGINX, HAProxy) ব্যবহার করে লোড ব্যালান্সিং করা হয়।
- Hardware Load Balancing: হার্ডওয়্যার ডিভাইস (যেমন F5 Load Balancer) ব্যবহার করা হয়।
- Client-Side Load Balancing: ক্লায়েন্ট নিজে থেকেই সঠিক সার্ভার নির্বাচন করে, যা সাধারণত Spring Cloud LoadBalancer বা Ribbon এর মাধ্যমে সম্ভব।
Spring Boot-এ Load Balancing
Spring Boot-এ সাধারণত Spring Cloud এর মাধ্যমে Client-Side Load Balancing করা হয়। Spring Boot বিভিন্ন টুল ব্যবহার করে লোড ব্যালান্সিং সমর্থন করে, যেমন:
- Spring Cloud LoadBalancer
- Ribbon (Spring Cloud Netflix Ribbon, পুরানো)
- Eureka (Service Discovery এর সাথে Load Balancing)
Spring Cloud LoadBalancer উদাহরণ
Spring Cloud LoadBalancer একটি Client-Side Load Balancer, যা Spring Boot 2.2 এবং তার পরে Ribbon-এর পরিবর্তে ব্যবহৃত হয়।
Maven Dependency:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
RestTemplate-এর মাধ্যমে Load Balancing:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class LoadBalancerConfig {
@Bean
@LoadBalanced // Load Balancing সক্ষম
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
@RestController
public class LoadBalancerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/fetch-data")
public String fetchData() {
String response = restTemplate.getForObject("http://example-service/data", String.class);
return response;
}
}
উপরে @LoadBalanced এনোটেশন ব্যবহার করলে Spring Cloud LoadBalancer কাজ করবে এবং সার্ভারগুলোর মধ্যে রিকোয়েস্ট সমানভাবে বিতরণ করবে।
Service Discovery-এর সাথে Load Balancing
Spring Boot + Eureka উদাহরণ:
- Service Discovery Configuration (Eureka Server): একটি সার্ভার তৈরি করুন যা সার্ভিসগুলো নিবন্ধন করে।
- Client-Side Load Balancing: Spring Cloud LoadBalancer এবং Eureka-এর সাহায্যে ক্লায়েন্ট নিজেই লোড ব্যালান্সিং পরিচালনা করে।
Spring Cloud LoadBalancer এর কিভাবে কাজ করে?
- Service Discovery (Eureka/Consul): ক্লায়েন্ট সার্ভিস লুকআপ করে সার্ভার লিস্ট পায়।
- Load Balancing Algorithm:
- Round-Robin: প্রতিটি সার্ভারে রিকোয়েস্ট ঘুরিয়ে ঘুরিয়ে পাঠায়।
- Random: এলোমেলোভাবে সার্ভার নির্বাচন করে।
- Custom Algorithm: কাস্টম লজিক প্রয়োগ করা যায়।
উদাহরণঃ WebClient এর মাধ্যমে Load Balancing
WebClient Config:
@Configuration
public class WebClientConfig {
@Bean
@LoadBalanced // Load Balancing সক্ষম
public WebClient.Builder webClientBuilder() {
return WebClient.builder();
}
}
Controller উদাহরণ:
@RestController
public class WebClientLoadBalancerController {
@Autowired
private WebClient.Builder webClientBuilder;
@GetMapping("/fetch-data")
public String fetchData() {
return webClientBuilder.build()
.get()
.uri("http://example-service/data")
.retrieve()
.bodyToMono(String.class)
.block();
}
}
Load Balancing-এর সুবিধা
- উচ্চ পারফরম্যান্স: সার্ভিসের লোড বিতরণ করা হলে দ্রুত রেসপন্স পাওয়া যায়।
- ডাউনটাইম রোধ: একটি সার্ভার ডাউন থাকলেও অন্য সার্ভার রিকোয়েস্ট হ্যান্ডেল করতে পারে।
- স্কেলেবিলিটি: অতিরিক্ত সার্ভার যোগ করে সিস্টেমের সক্ষমতা বাড়ানো যায়।
- ব্যবসায়িক স্থায়িত্ব: সার্ভিসের ধারাবাহিকতা বজায় থাকে।
Load Balancing-এর সীমাবদ্ধতা
- সঠিক কনফিগারেশন প্রয়োজন: ভুল কনফিগারেশন হলে লোড সমানভাবে বিতরণ নাও হতে পারে।
- কমপ্লেক্সিটি: বড় মাপের সিস্টেমে লোড ব্যালান্সিং সেটআপ জটিল হতে পারে।
- Latency: সার্ভার লুকআপের কারণে সামান্য লেটেন্সি বাড়তে পারে।
উপসংহার
Spring Boot-এর Load Balancing ফিচার সার্ভারগুলোর মধ্যে রিকোয়েস্ট সমানভাবে বিতরণ করে সিস্টেমের পারফরম্যান্স, স্থিতিশীলতা, এবং রেডান্ডেন্সি বৃদ্ধি করে। এটি বড় এবং জটিল মাইক্রোসার্ভিস ভিত্তিক অ্যাপ্লিকেশনগুলোর জন্য অপরিহার্য।
Spring Cloud LoadBalancer এবং Ribbon হল Spring Framework এর দুটি উপাদান যা মাইক্রোসার্ভিস আর্কিটেকচারে লোড ব্যালেন্সিং নিশ্চিত করতে ব্যবহার করা হয়। এগুলি সার্ভিসগুলির মধ্যে ভারসাম্যপূর্ণ এবং দক্ষ যোগাযোগ স্থাপন করতে সাহায্য করে।
Spring Cloud LoadBalancer
Spring Cloud LoadBalancer হলো Spring Cloud এর অংশ, যা Ribbon-এর বিকল্প হিসেবে কাজ করে। এটি Spring Boot এর নতুন এবং আধুনিক লোড ব্যালেন্সিং সমাধান।
Spring Cloud LoadBalancer সেটআপ:
১. ডিপেনডেন্সি যোগ:
Spring Boot 2.4 থেকে Spring Cloud LoadBalancer ডিফল্ট ভাবে উপলব্ধ। তবে নিশ্চিত করতে নিচের ডিপেনডেন্সি যোগ করুন:
Maven:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
Gradle:
implementation 'org.springframework.cloud:spring-cloud-starter-loadbalancer'
২. RestTemplate এর সাথে LoadBalancer সংযুক্ত করা:
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
৩. RestTemplate দিয়ে সার্ভিস কল করা:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class LoadBalancerController {
private final RestTemplate restTemplate;
public LoadBalancerController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@GetMapping("/get-data")
public String getData() {
String url = "http://my-service-name/api/data"; // সার্ভিসের নাম
return restTemplate.getForObject(url, String.class);
}
}
- নোট: সার্ভিসের নাম (যেমন
my-service-name) DNS-এ সমাধান করা হবে Spring Cloud LoadBalancer এর মাধ্যমে।
৪. Custom LoadBalancer Configuration:
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClients;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import reactor.core.publisher.Flux;
@Configuration
@LoadBalancerClients({
@LoadBalancerClient(name = "my-service-name", configuration = CustomLoadBalancerConfig.class)
})
public class CustomLoadBalancerConfig {
@Bean
public ServiceInstanceListSupplier serviceInstanceListSupplier() {
return new ServiceInstanceListSupplier() {
@Override
public Flux<List<ServiceInstance>> get() {
// Custom logic for instance selection
return Flux.just(List.of(
// Define your service instances here
));
}
};
}
}
Spring Cloud Ribbon (ডিপ্রিকেটেড)
Ribbon একসময় Spring Framework এর ডিফল্ট লোড ব্যালেন্সার ছিল। Spring Cloud 2020 (Hoxton) এর পরে এটি ডিপ্রিকেটেড হয়েছে এবং Spring Cloud LoadBalancer এর মাধ্যমে প্রতিস্থাপিত হয়েছে।
Ribbon ব্যবহার (Legacy Projects):
১. ডিপেনডেন্সি যোগ:
Ribbon ব্যবহার করতে Spring Cloud Netflix Starter ডিপেনডেন্সি যোগ করুন।
Maven:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
২. RestTemplate এর সাথে Ribbon সংযুক্ত করা:
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RibbonConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
৩. Ribbon কনফিগারেশন (application.yml):
Ribbon সার্ভিস ডিসকভারি এবং লোড ব্যালেন্সিং কনফিগার করার জন্য প্রয়োজন।
my-service-name:
ribbon:
listOfServers: localhost:8081,localhost:8082
ConnectTimeout: 5000
ReadTimeout: 5000
৪. Ribbon দিয়ে সার্ভিস কল:
@RestController
public class RibbonController {
private final RestTemplate restTemplate;
public RibbonController(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
@GetMapping("/ribbon-test")
public String ribbonTest() {
String url = "http://my-service-name/api/data";
return restTemplate.getForObject(url, String.class);
}
}
Spring Cloud LoadBalancer বনাম Ribbon:
| বৈশিষ্ট্য | Spring Cloud LoadBalancer | Ribbon (Deprecated) |
|---|---|---|
| স্ট্যাটাস | Active | Deprecated (Spring Cloud 2020 থেকে বন্ধ করা হয়েছে)। |
| Configuration Method | Annotation এবং Programmatic | Mostly YAML/Properties-based |
| Customizability | সহজে কাস্টমাইজ করা যায়। | কম কাস্টমাইজেবল। |
| Reactive Support | সমর্থন করে। | সমর্থন করে না। |
| Dependency | Spring Cloud Starter LoadBalancer | Spring Cloud Netflix Ribbon |
উপসংহার:
- Spring Cloud LoadBalancer হল Ribbon এর উন্নত বিকল্প, যা Spring Boot এর নতুন সংস্করণগুলির জন্য উপযুক্ত।
- যদি আপনার অ্যাপ্লিকেশনে Spring Boot 2.4+ ব্যবহার করা হয়, তাহলে Spring Cloud LoadBalancer ব্যবহার করুন।
- Legacy প্রোজেক্টের জন্য Ribbon প্রয়োজন হলে সেটি ঠিকভাবে কনফিগার করুন।
প্রয়োজন হলে আরও উদাহরণ বা বিস্তারিত জানাতে বলুন! 😊
Client-side load balancing হলো এমন একটি পদ্ধতি, যেখানে ক্লায়েন্ট অ্যাপ্লিকেশন সার্ভিস ইন্সট্যান্সগুলোর তালিকা পায় এবং নিজে থেকেই সার্ভিস ইন্সট্যান্স নির্বাচন করে। Spring Boot-এ Spring Cloud LoadBalancer এবং Ribbon (ডিপ্রিকেটেড) ব্যবহার করে ক্লায়েন্ট-সাইড লোড ব্যালেন্সিং সেটআপ করা যায়।
Spring Cloud LoadBalancer ব্যবহার (প্রস্তাবিত পদ্ধতি)
Spring Cloud LoadBalancer কী?
Spring Cloud LoadBalancer হলো একটি ক্লায়েন্ট-সাইড লোড ব্যালেন্সার, যা API কল করার সময় বিভিন্ন সার্ভিস ইন্সট্যান্সের মধ্যে লোড ভাগাভাগি করে।
Client-Side Load Balancing সেটআপ করার ধাপ
১. ডিপেন্ডেন্সি যোগ করা
Spring Cloud LoadBalancer ব্যবহার করতে, আপনার pom.xml বা build.gradle-এ নিচের ডিপেন্ডেন্সি যোগ করুন:
Maven:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
Gradle:
implementation 'org.springframework.cloud:spring-cloud-starter-loadbalancer'
২. application.yml কনফিগার করা
সার্ভিস ইন্সট্যান্সগুলোর তালিকা কনফিগার করুন। উদাহরণস্বরূপ, যদি আপনার order-service নামে একটি সার্ভিস থাকে:
spring:
cloud:
discovery:
client:
simple:
instances:
order-service:
- uri: http://localhost:8081
- uri: http://localhost:8082
- uri: http://localhost:8083
৩. WebClient-এ Load Balancer ইন্টিগ্রেশন
Spring Cloud LoadBalancer ব্যবহার করতে WebClient-এ সরাসরি ইন্টিগ্রেশন করা যায়।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;
@Configuration
public class WebClientConfig {
@Bean
public WebClient.Builder webClientBuilder() {
return WebClient.builder();
}
}
৪. API কলের উদাহরণ
Spring Cloud LoadBalancer-কে @LoadBalanced দিয়ে নির্দেশ করতে হয় যে এটি লোড ব্যালেন্সিং করতে হবে।
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
@Service
public class OrderServiceClient {
private final WebClient.Builder webClientBuilder;
@Autowired
public OrderServiceClient(WebClient.Builder webClientBuilder) {
this.webClientBuilder = webClientBuilder;
}
public String fetchOrderDetails() {
return webClientBuilder.build()
.get()
.uri("http://order-service/orders") // সার্ভিস নাম ব্যবহার করুন
.retrieve()
.bodyToMono(String.class)
.block();
}
}
Ribbon ব্যবহার (ডিপ্রিকেটেড)
১. ডিপেন্ডেন্সি যোগ করা
Ribbon ব্যবহার করতে, নিচের ডিপেন্ডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
২. application.yml কনফিগার করা
Ribbon সার্ভিস ইন্সট্যান্সের তালিকা থেকে সার্ভিস লোড ব্যালেন্স করবে:
order-service:
ribbon:
listOfServers: localhost:8081,localhost:8082,localhost:8083
৩. RestTemplate ব্যবহার
Ribbon-এ লোড ব্যালেন্সিং করতে @LoadBalanced অ্যানোটেশন ব্যবহার করুন।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
৪. API কলের উদাহরণ
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class OrderServiceClient {
private final RestTemplate restTemplate;
@Autowired
public OrderServiceClient(RestTemplate restTemplate) {
this.restTemplate = restTemplate;
}
public String fetchOrderDetails() {
return restTemplate.getForObject("http://order-service/orders", String.class);
}
}
Custom Load Balancer Strategy
Spring Cloud LoadBalancer-এ আপনি কাস্টম লোড ব্যালেন্সিং স্ট্র্যাটেজি ব্যবহার করতে পারেন।
উদাহরণ: কাস্টম স্ট্র্যাটেজি
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.core.ReactorServiceInstanceLoadBalancer;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class LoadBalancerConfig {
@Bean
public ReactorServiceInstanceLoadBalancer customLoadBalancer(ServiceInstanceListSupplier supplier) {
return new RandomLoadBalancer(supplier, "order-service"); // Random Load Balancing
}
}
Client-Side Load Balancing ও Discovery Service ইন্টিগ্রেশন
Spring Cloud LoadBalancer ইন্টিগ্রেশন Eureka বা অন্য Discovery সার্ভিসের সাথেও করা যায়।
Eureka Client-সাথে ইন্টিগ্রেশন:
pom.xml-এ ডিপেন্ডেন্সি যোগ করুন:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
উপসংহার
- Spring Cloud LoadBalancer:
আধুনিক Spring Boot অ্যাপ্লিকেশনের জন্য সবচেয়ে উপযুক্ত। - Ribbon (Deprecated):
পূর্বে ব্যবহৃত ক্লায়েন্ট-সাইড লোড ব্যালেন্সার। নতুন প্রকল্পে ব্যবহার না করার পরামর্শ। - Custom Strategy:
বিশেষ ক্ষেত্রে কাস্টম লোড ব্যালান্সিং পদ্ধতি সেটআপ করা সম্ভব।
উপরোক্ত কৌশলগুলো ব্যবহার করে আপনি একটি রিলায়েবল ক্লায়েন্ট-সাইড লোড ব্যালান্সিং মেকানিজম ইমপ্লিমেন্ট করতে পারবেন।
Read more